CPWC simulation with the USTB built-in Fresnel simulator
In this example we show how to use the built-in fresnel simulator in USTB to generate a Coherent Plane-Wave Compounding (CPWC) dataset and how it can be beamformed with USTB.
Related materials:
by Alfonso Rodriguez-Molares alfonso.r.molares@ntnu.no 31.03.2017
Contents
Phantom
pha=uff.phantom(); pha.sound_speed=1540; % speed of sound [m/s] pha.points=[0, 0, 20e-3, 1]; % point scatterer position [m] fig_handle=pha.plot();
Probe
prb=uff.linear_array(); prb.N=128; % number of elements prb.pitch=300e-6; % probe pitch in azimuth [m] prb.element_width=270e-6; % element width [m] prb.element_height=5000e-6; % element height [m] prb.plot(fig_handle);
Pulse
pul=uff.pulse(); pul.center_frequency=5.2e6; % transducer frequency [MHz] pul.fractional_bandwidth=0.6; % fractional bandwidth [unitless] pul.plot([],'2-way pulse');
Sequence generation
F_number=1.7; alpha_max=1/2/F_number; N=31; % number of plane waves angles=linspace(-alpha_max,alpha_max,N); % angle vector [rad] seq=uff.wave(); for n=1:N seq(n)=uff.wave(); seq(n).wavefront=uff.wavefront.plane; seq(n).source.azimuth=angles(n); seq(n).probe=prb; seq(n).sound_speed=pha.sound_speed; % show source fig_handle=seq(n).source.plot(fig_handle); end
The Fresnel simulator
sim=fresnel(); % setting input data sim.phantom=pha; % phantom sim.pulse=pul; % transmitted pulse sim.probe=prb; % probe sim.sequence=seq; % beam sequence sim.sampling_frequency=41.6e6; % sampling frequency [Hz] % we launch the simulation channel_data=sim.go();
USTB's Fresnel impulse response simulator (v1.0.7) ---------------------------------------------------------------
Scan
scan=uff.linear_scan('x_axis', linspace(-2e-3,2e-3,256).', 'z_axis', linspace(18e-3,22e-3,256).');
midprocess
das=midprocess.das(); das.channel_data=channel_data; das.scan=scan; das.dimension = dimension.both(); das.transmit_apodization.window=uff.window.tukey25; das.transmit_apodization.f_number=F_number; das.receive_apodization.window=uff.window.tukey25; das.receive_apodization.f_number=F_number; % beamforming b_data=das.go(); % show figure; h1=subplot(2,2,1) b_data.plot(h1,'No tilt');
USTB General beamformer MEX v1.1.2 .............done! h1 = Axes with properties: XLim: [0 1] YLim: [0 1] XScale: 'linear' YScale: 'linear' GridLineStyle: '-' Position: [0.1300 0.5838 0.3347 0.3412] Units: 'normalized' Use GET to show all properties
transmit tilt
das.transmit_apodization.tilt=30*pi/180;
b_data=das.go();
h2=subplot(2,2,2)
b_data.plot(h2,'TX 20 degrees');
uff.apodization: Inputs and outputs are unchanged. Skipping process. USTB General beamformer MEX v1.1.2 .............done! h2 = Axes with properties: XLim: [0 1] YLim: [0 1] XScale: 'linear' YScale: 'linear' GridLineStyle: '-' Position: [0.5703 0.5838 0.3347 0.3412] Units: 'normalized' Use GET to show all properties
receive tilt
das.transmit_apodization.tilt=0;
das.receive_apodization.tilt=-30*pi/180;
b_data=das.go();
h3=subplot(2,2,3)
b_data.plot(h3,'RX -20 degrees');
USTB General beamformer MEX v1.1.2 .............done! h3 = Axes with properties: XLim: [0 1] YLim: [0 1] XScale: 'linear' YScale: 'linear' GridLineStyle: '-' Position: [0.1300 0.1100 0.3347 0.3412] Units: 'normalized' Use GET to show all properties
transmit & receive tilt
das.transmit_apodization.tilt=30*pi/180;
das.receive_apodization.tilt=-30*pi/180;
b_data=das.go();
h4=subplot(2,2,4)
b_data.plot(h4,'TX 20 RX -20 degrees');
uff.apodization: Inputs and outputs are unchanged. Skipping process. USTB General beamformer MEX v1.1.2 .............done! h4 = Axes with properties: XLim: [0 1] YLim: [0 1] XScale: 'linear' YScale: 'linear' GridLineStyle: '-' Position: [0.5703 0.1100 0.3347 0.3412] Units: 'normalized' Use GET to show all properties